/**
 * @name        directives.ts
 * @author      shenyc
 * @date        2020-05-06 - ?
 * @copyright   Copy right (c) shenyc (shenyczz@163.com).
 *              All rights reserved.
 *
 ******************************************************************************/
// {{@@@}}
"use strict"
// ----------------------------------------------------------------------------
import type { App } from "vue"
// ----------------------------------------------------------------------------

// const directivesList: { [key: string]: Directive } = {
//     auth,
//     copy,
//     waterMarker,
//     draggable,
//     debounce,
//     throttle,
//     longpress,
// }

/**
 * 自定义指令 - 全局注册
 *
 * @description 一个指令的定义对象可以提供几种钩子函数 (都是可选的)：
 *
 * @example
 *
 * const myDirective = {
 *     // 在绑定元素的 attribute 前或事件监听器应用前调用
 *     created(el, binding, vnode) {},
 *
 *     // 在元素被插入到 DOM 前调用
 *     beforeMount(el, binding, vnode) {},
 *
 *     // 在绑定元素的父组件及他自己的所有子节点都挂载完成后调用
 *     mounted(el, binding, vnode) {},
 *
 *     // 绑定元素的父组件更新前调用
 *     beforeUpdate(el, binding, vnode, prevVnode) {},
 *
 *     // 在绑定元素的父组件及他自己的所有子节点都更新后调用
 *     updated(el, binding, vnode, prevVnode) {},
 *
 *     // 绑定元素的父组件卸载前调用
 *     beforeUnmount(el, binding, vnode) {},
 *
 *     // 绑定元素的父组件卸载后调用
 *     unmounted(el, binding, vnode) {},
 * }
 *
 * 钩子参数:
 *
 * - el：指令绑定到的元素。这可以用于直接操作 DOM。
 *
 * - binding：一个对象，包含以下属性。
 *
 *   - value：传递给指令的值。例如在 v-my-directive="1 + 1" 中，值是 2。
 *   - oldValue：之前的值，仅在 beforeUpdate 和 updated 中可用。无论值是否更改，它都可用。
 *   - arg：传递给指令的参数 (如果有的话)。例如在 v-my-directive:foo 中，参数是 "foo"。
 *   - modifiers：一个包含修饰符的对象 (如果有的话)。例如在 v-my-directive.foo.bar 中，修饰符对象是 { foo: true, bar: true }。
 *   - instance：使用该指令的组件实例。
 *   - dir：指令的定义对象。
 *
 * - vnode：代表绑定元素的底层 VNode。
 *
 * - prevVnode：代表之前的渲染中指令所绑定元素的 VNode。仅在 beforeUpdate 和 updated 钩子中可用。
 *
 */

export const _directives = {
    install: (app: App<Element>, ...options: any[]) => {
        // 使 v-mark 全局可用
        app.directive("mark", {
            /* ... */
        })

        // Object.keys(directivesList).forEach((key) => {
        //     app.directive(key, directivesList[key])
        // })
        // for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
        //     app.component(`${key}`, component)
        // }
    },
}
export default _directives
// ----------------------------------------------------------------------------
// {{@@@}}
/*



import { App, Directive } from "vue";
import auth from "./modules/auth";
import copy from "./modules/copy";
import waterMarker from "./modules/waterMarker";
import draggable from "./modules/draggable";
import debounce from "./modules/debounce";
import throttle from "./modules/throttle";
import longpress from "./modules/longpress";

const directivesList: { [key: string]: Directive } = {
  auth,
  copy,
  waterMarker,
  draggable,
  debounce,
  throttle,
  longpress
};

const directives = {
  install: function (app: App<Element>) {
    Object.keys(directivesList).forEach(key => {
      app.directive(key, directivesList[key]);
    });
  }
};

export default directives;
*/
